<?php
/**
 * comm function for system
 *
 * @copyright (c) 与非门科技有限公司(http://www.eefocus.com)
 * @author kokko<kokko313@gmail.com>
 * @package com
 * @subpackage eefocus.function
 * @version 2.0 2007-10-25
 */
if (!defined('LIB_PATH')) exit( 'System error,Please defined LIB_PATH const first!' );

/**
 * 类自动加载函数 > php 5.0
 * 这里主要是用于加载核心类库
 * 
 * @param string $class - 自定加载类名
 * @return bool
*/
function __autoload( $class ){
	static $_class = array();
	if( isset( $_class[$class] ) )
		return true;
	$trueCls = $class;
	// 自动加载当前项目的Actioon类和Dao类
	if(substr($class,-5)=='Model'&& strlen( $class )>5) {
		$trueCls = 'Lib.'.$class;
	}elseif(substr($class,-6)=="Action" && strlen( $class )>6){
		$trueCls = 'Action.'.$class;
	}
	$classPath = import( $trueCls );
	if( $classPath!==false ){
		$_class[$class] = true;
		return true;
	}
	//自动加载包
	$_autoPackage = conf('AUTO_LOAD_PACKAGE');
	if( !empty( $_autoPackage ) ){
		foreach( $_autoPackage as $package ){
			$classPath = import( $package.".".$class );
			if( $classPath!==false ){
				$_class[$class] = true;
				return true;
			}
		}
	}
	throwException( "Auto load $class failed" );
}

/**
 * 导入所需的类库 支持目录和* 同java的Import
 * 本函数有缓存功能 
 *
 * @param string $class 类库命名空间字符串
 * @param string $baseUrl 包存在的起始路径
 * @param string $prefix 类前缀
 * @param string $suffix 类后缀
 * @param string $subdir 是否导入子目录 默认false
 * @return boolen
 */
function import( $class,$baseUrl = null,$prefix = 'class_',$suffix = '.php',$subdir = false ){
	static $_class = array();
	if(isset($_class[strtolower($class.$baseUrl)]))
		 return $_class[strtolower($class.$baseUrl)];
	$tureClassName = strrchr( $class,"." );
	if( $tureClassName==".*" ){
		//导入整个目录，暂时没有实现，待扩展
	}elseif( !empty( $tureClassName ) ){
		$tureClassName = str_replace( '.','',$tureClassName );
		$relativeClsPath = str_replace( '.','/',$class ).$suffix;
		$relativeClsPath = str_replace( $tureClassName.$suffix,$prefix.$tureClassName.$suffix,$relativeClsPath );
	}else{
		$relativeClsPath = $prefix.$class.$suffix;
		$tureClassName = $class;
	}
	$absClsPath = false;
	//如果指定了包存在的路径
	if( !empty( $baseUrl ) ){
		$absClsPath = $baseUrl."/".$relativeClsPath;
		if( !file_exists( $absClsPath ) ){
			return false;
		}
	}elseif( file_exists( $relativeClsPath ) ){//当前目录下搜索
		$absClsPath = "./".$relativeClsPath;
	}elseif( file_exists( LIB_PATH."/".$relativeClsPath ) ){ //系统目录中、
		$absClsPath = LIB_PATH."/".$relativeClsPath;
	}elseif( file_exists( APP_PATH."/".$relativeClsPath ) ){ //项目目录中
		$absClsPath = APP_PATH."/".$relativeClsPath;
	}else{
		return false;
	}
	if( $absClsPath!==false  ){
		include_once( $absClsPath );
		$_class[strtolower($class.$baseUrl)] = $tureClassName;
		return $tureClassName;
	}
	return false;
}

/**
 * 自定义异常处理
 *
 * @param string $msg 错误信息
 * @param string $type 异常类型 默认为Exceptions
 * 如果指定的异常类不存在，则直接输出错误信息
 * @return void
 * @version 1.0
 */
function throwException($msg,$type='Exceptions',$code=0)
{
	if(class_exists($type,false)){
		throw new $type($msg,$code,true);
	}else {
		// 异常类型不存在则输出错误信息字串
		exit($msg);
	}
}

/**
 * 获取配置值、设置系统配置变量
 * 当$name为空时，取得整个变量数组
 * 当$name为数组时，缓存数组变量
 * 当$value不为空，$name不为空，设置变量值
 * 
 * @param mix $name 系统变量名
 * @param mix $value 值
 */
function conf($name='',$value=null) {
	static $_config = array();
	if(!is_null($value)) {
		$_config[strtolower($name)]	=	$value;
		return;
	}
	if(empty($name)) {
		return $_config;
	}
	// 缓存全部配置值
	if(is_array($name)) {
		$_config = array_merge($_config,array_change_key_case($name));
		return $_config;
	}
	//如果有GLOBALS
	if( isset( $GLOBALS['CONFIG'][$name] ) ){
		$_config[strtolower($name)] = $GLOBALS['CONFIG'][$name];
		return $GLOBALS['CONFIG'][$name];
	}

	if(isset($_config[strtolower($name)])) {
		return $_config[strtolower($name)];
	}else{
		return false;
	}
}

/**
 * 获取语言定义、设置语言定义
 * 当$name为空时，取得整个变量数组
 * 当$name为数组时，缓存数组变量
 * 当$value不为空，$name不为空，设置变量值
 * 
 * @param mix $name 系统变量名
 * @param mix $value 值
 */
function lang($name='',$value=null) {
	static $_lang = array();
	if(!is_null($value)) {
		$_lang[strtolower($name)]	=	$value;
		return;
	}
	if(empty($name)) {
		return $_lang;
	}
	if(is_array($name)) {
		$_lang = array_merge($_lang,array_change_key_case($name));
		return $_lang;
	}
	//如果有GLOBALS
	if( isset( $GLOBALS['_LANG'][$name] ) ){
		$_config[strtolower($name)] = $GLOBALS['_LANG'][$name];
		return $GLOBALS['_LANG'][$name];
	}
	if(isset($_lang[strtolower($name)])) {
		return $_lang[strtolower($name)];
	}else{
		return false;
	}
}

/**
 * 追加日志记录
 *
 * @param string $msg
 * @param string $level
 */
function logMessage($msg, $level=1)
{
    static $loger = null;
	$logerSetting = conf('LOGER_SETTING');
	if( $logerSetting===false )
		return;
    if ( $loger == null ) {
		//如果输出格式不是html就将log显示强制为文件存贮，避免输出xml是出错
		if( conf( 'OUT_PUT_FORMAT' )!='html' )
			$logerSetting['LogType'] = 'FILE';
		import( $logerSetting['LogClass'] );
    	$loger = new $logerSetting['LogClass'];
    	$loger->setLogFileName( $logerSetting['LogFile'] );
    	$loger->setLogType( $logerSetting['LogType'] );
    }
    return $loger->appendLog($msg, $level);
}//end function

/**
 * 实例化smarty模板链接
 * 
 * @param array $config - 配置数组
 * @param bool $cache - 是否缓存，有时候同一个页面需要不通的模板设置
 * @return object
 */
function getView( $config = null,$cache = true ){
	static $smartyCache = null;
	if( $smartyCache!==null && $cache )
		return $smartyCache;
	include_once( LIB_PATH."/smarty/Smarty.class.php" );
	$smarty = new Smarty;
	if( $config ==null ){
		$smartyConfig = conf('VIEW_SET');
	}else{
		$smartyConfig = $config;
	}
	foreach( @$smartyConfig as $key=>$value ){
		if( empty( $key ) || empty( $value ) )
			continue;
		if( substr( $key,-3,3 ) == 'dir' && !is_dir( $value ) ){
			Files::mkdirs( $value, 0777 );
		}
		$smarty->$key = $value;
	}
	if( $cache )
		$smartyCache = $smarty;
	return $smarty;
}

/**
 * 全局缓存设置和读取
 * 
 * @param string $name
 * @param mix $value
 * @param mix $expire
 * @param mix $type
 * @return object
 */
function cache($name,$value='',$expire='',$type='') {
	static $_cache = array();
	import('Cache');
	//取得缓存对象实例
	$cache  = Cache::getInstance($type);
	if('' !== $value) {
		if(is_null($value)) {
			// 删除缓存
			$result	=	$cache->del($name);
			if($result) {
				unset($_cache[$type.'_'.$name]);
			}
			return $result;
		}else{
			// 缓存数据
			$cache->set($name,$value,$expire);
			$_cache[$type.'_'.$name]	 =	 $value;
		}
		return ;
	}
	if(isset($_cache[$type.'_'.$name])) {
		return $_cache[$type.'_'.$name];
	}
	// 获取缓存数据
	$value      =  $cache->get($name);
	$_cache[$type.'_'.$name]	 =	 $value;
	return $value;
}

/**
 * URL跳转
 * <code>
 * redirect( "test.php",3,"<a href='wwwww'>hohhohoho</a>" );
 * </code>
 *
 * @param String $url - 跳转路径
 * @param int $time - 跳转延时时间
 * @param Sting $msg - 跳转前显示信息
 */
function redirect($url,$time=0,$msg='')
{
    //多行URL地址支持
    $url = str_replace(array("\n", "\r"), '', $url);
	if( empty( $url ) )
		$url = $_SERVER['HTTP_REFERER'];
    if(empty($msg)) {
        $msg    =   "系统将在{$time}秒之后自动跳转到{$url}！";
    }
    if (!headers_sent()) {
        // redirect
        header("Content-Type:text/html; charset=utf-8");
        if(0===$time) {
        	header("Location: ".$url); 
        }else {
            header("refresh:{$time};url={$url}");
            echo($msg);
        }
        exit();
    }else {
        $str    = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
        if($time!=0) {
            $str   .=   $msg;
        }
        exit($str);
    }
}

/**
 * json encode
 *
 * @param mix $data
 * @return string
 */
if (!function_exists('json_encode')) {
function format_json_value(&$value) 
{
	if(is_int($value)) {
		$value = intval($value);
	} else if(is_float($value)) {
		$value = floatval($value);
	} else if(defined($value) && $value === null) {
		$value = strval(constant($value));
	} else if(is_string($value)) {
		$value = '"'.addslashes($value).'"';
	}
	return $value;
}

function json_encode($data) 
{
	if(is_object($data)) {
		//对象转换成数组
		$data = get_object_vars($data);
	}else if(!is_array($data)) {
		// 普通格式直接输出
		return format_json_value($data);
	}
	// 判断是否关联数组
	if(empty($data) || is_numeric(implode('',array_keys($data)))) {
		$assoc  =  false;
	}else {
		$assoc  =  true;
	}
	// 组装 Json字符串
	$json = $assoc ? '{' : '[' ;
	foreach($data as $key=>$val) {
		if(!is_null($val)) {
			if($assoc) {
				$json .= "\"$key\":".json_encode($val).",";
			}else {
				$json .= json_encode($val).",";
			}            	
		}
	}
	if(strlen($json)>1) {// 加上判断 防止空数组
		$json  = substr($json,0,-1);
	}
	$json .= $assoc ? '}' : ']' ;
	return $json;
}
}

/**
 * json dencode
 *
 * @param mix $json
 * @param bool $assoc
 * @return mix
 */
if (!function_exists('json_decode')) {
function json_decode($json,$assoc=false) 
{
	// 目前不支持二维数组或对象
	$begin  =  substr($json,0,1) ;
	if(!in_array($begin,array('{','['))) {
		// 不是对象或者数组直接返回
		return $json;
	}
	$parse = substr($json,1,-1);
	$data  = explode(',',$parse);
	if($flag = $begin =='{' ) {
		// 转换成PHP对象
		$result   = new stdClass();
		foreach($data as $val) {
			$item    = explode(':',$val);
			$key =  substr($item[0],1,-1);
			$result->$key = json_decode($item[1],$assoc);
		}
		if($assoc) {
			$result   = get_object_vars($result);
		}
	}else {
		// 转换成PHP数组
		$result   = array();
		foreach($data as $val) {
			$result[]  =  json_decode($val,$assoc);
		}
	}
	return $result;
}
}
?>